home *** CD-ROM | disk | FTP | other *** search
/ Scene Storm / Scene Storm - Volume 1.iso / coding / c / amiexpress / source / ae / code / ax3.00 / main.c < prev    next >
Encoding:
C/C++ Source or Header  |  1980-01-03  |  21.4 KB  |  799 lines

  1. #define MAIN_PROG
  2. #include "bbs.h"
  3. #undef MAIN_PROG
  4.  
  5. #include <graphics/displayinfo.h>
  6. #include <intuition/intuition.h>
  7. #include <graphics/gfxbase.h>
  8. #include <clib/intuition_protos.h>
  9. #include <clib/graphics_protos.h>
  10. #include "deadline.h"
  11. void ModemOffHook(void);
  12. BOOL ReadComputerTypes(void);
  13. void Randomize(void);
  14. void AllocateConfs(int NumConfs);
  15. void DeAllocateConfs(void);
  16. static void closelibs(void);
  17. int Menu(void);
  18. int Logon_Sequence(void);
  19.  
  20. int LastValidUser = 2;
  21. int Dropped_Hook=0;
  22. int NotRelative=TRUE;
  23. char langtitle[80];
  24. char lang[20];
  25. extern char *MyVerStr;
  26. struct Commands HCmds;
  27. char *SkipdFiles;
  28. char SystemPrompt[80];
  29. int relogon;
  30. int templogon;
  31. int RingCount;
  32.  
  33. void CheckDeadLine(ULONG myTime);
  34. struct NewScreen MYNewScreen =
  35.  {
  36.  0,0,640,200,3,0,1,  /* leftedge,topedge,Width,Height,Depth,DetailPen, BlockPen */
  37.  HIRES,CUSTOMSCREEN,NL,           /* display modes,screen type,Font */
  38.  NL,NL,NL                           /* Title,screen gadgets,CustomBitMap  */
  39. };
  40.  
  41. struct NewWindow MYNewWindow = {
  42.   0,12,640, 188,      /* left edge, top edge, width, height */
  43.   0, 1, NL,
  44.   ACTIVATE|BACKDROP|BORDERLESS,
  45.   NL, NL, NL, NL, NL, 70, 30, 704, 480, CUSTOMSCREEN
  46. };
  47.  
  48. struct NewWindow PaneStatus =
  49. { 0,10,640,30,3,4, NL,SIMPLE_REFRESH,NL,NL,NL,NL,NL,0,0,640,40, CUSTOMSCREEN};
  50.  
  51. struct NewWindow CloseIt = {
  52.   0,0,28,10,0,1,          /* 0,0,587,10,0,1 */
  53.   GADGETUP|GADGETDOWN,NOCAREREFRESH|BORDERLESS,
  54.   NL,NL,NL,NL,NL,0,0,640,40,CUSTOMSCREEN
  55. };
  56.  
  57. struct Gadget MG =
  58.  {NL,0,0,0,0,GADGHCOMP|GADGIMAGE,RELVERIFY, BOOLGADGET,NL,NL,NL,NL,0,NL};
  59.  
  60. /* this has to stay the same size since below we set the 20th pos to the node number */
  61. #define OPENIT_WINTITLE  "AmiExpress BBS Node xxx"
  62.  
  63. struct NewWindow OpenIt = {
  64.   0,11,300,23,0,1,            /* 0,0,587,10,0,1 */
  65.   CLOSEWINDOW,WINDOWDRAG|WINDOWDEPTH|NOCAREREFRESH|WINDOWCLOSE,
  66.   NL,NL,OPENIT_WINTITLE,         /* Convert to AmiExpress BBS Node xxx */
  67.   NL,NL,0,0,640,40,WBENCHSCREEN
  68. };
  69.  
  70. struct NewWindow ZmodemStats = {
  71.   170,50,350,125,0,1,         /* 0,0,587,10,0,1 */
  72.   CLOSEWINDOW,WINDOWDRAG|NOCAREREFRESH|WINDOWCLOSE,
  73.   NL,NL,NL, NL,NL,0,0,350,130,CUSTOMSCREEN };
  74.  
  75.  
  76. /* moved from flagfiles.c ..was static */
  77. char *IsInList(char *s,char *c,int *length);  /* also used in check_list.c */
  78.  
  79. /* Stealth Mode, Requires STEALTH_MODE in the Node icon to activate */
  80. /* This tells express to ask for the system password before displaying
  81.    any connect messages 
  82. */
  83.  
  84. int Stealth=0;
  85.  
  86. int AddFlagtoList(char *s)
  87. {
  88.  char *p;
  89.  int stat;
  90.  if(strlen(s)>1) {
  91.      strupr(s);
  92.      strcat(s," ");
  93.      if(strlen(flaglist)+strlen(s)>2040) {
  94.          AEPutStr("Too many flags\r\n");
  95.          return(1);
  96.      }
  97.      if(!(p=IsInList(flaglist,s,&stat)))     strcat(flaglist,s);
  98.      return(2);
  99.  }
  100.  return(0);
  101. }
  102.  
  103.  /* remove file from Nodework (normally t: dir) that tells who is online
  104.  (each node )*/
  105.  
  106. static void ClearUser(void)
  107.  
  108. {
  109.  
  110.  sprintf(GSTR1,"%snode%ld.user",NodeWork,Cmds->AcLvl[LVL_NODE_NUMBER]);
  111.  DeleteFile(GSTR1);
  112.  
  113.  sprintf(GSTR1,"%snode%ld.userkeys",NodeWork,Cmds->AcLvl[LVL_NODE_NUMBER]);
  114.  DeleteFile(GSTR1);
  115. }
  116.  
  117. static void Display_Logo(void)
  118. {
  119.  ConPutStr("\014\n\n\n\n\n                               Express BBS\n\n");
  120.  ConPutStr("                             Initializing...");
  121. }
  122.  
  123. static char PortName[30];  /* our MsgPort Name, Node # appended */
  124.  
  125. #define RN 37L            /* current library version */
  126.  
  127. static void Init_System(BYTE iconats)
  128. {
  129.  
  130.  
  131. if(iconats)
  132.     {
  133.      IconifySig=0L;
  134.     KEYIN=0; 
  135.     ICON=1;
  136.     }
  137. else
  138.     {
  139.      ICON=0;
  140.     OpenDisplay();
  141.     Display_Logo();
  142.     }
  143.  OpenTimer();
  144.  TimerSig=1L<<TimerPort->mp_SigBit;
  145.  
  146.  MyClearStatusPane();     /* (RTS) clear status pane & install user */
  147.  
  148. if(!(HistoryBuf=(UBYTE *)AllocMem(MAXHIST*250,MEMF_CLEAR)))
  149.      ShutDown("No memory for history");
  150.  
  151.  if(OpenSerial(Cmds->OpeningBaud,(UBYTE)8,(UBYTE)1)!=0) {
  152.      sprintf(GSTR3,"Can't open %s!",Cmds->SerDev);
  153.      ShutDown(GSTR3);
  154.  }
  155.  if(!TrapDoor)
  156.  {
  157.    IntDoReset(Sopt->OffHook);
  158.    Delay(60L);
  159.    SerPutStr(Cmds->MInit);
  160.    SerPutChar("\r");
  161.    Delay(60L);
  162.  }
  163.  PurgeLine();
  164.  
  165.  
  166. }
  167.  
  168.  
  169. struct DiskObject *ConfObj=NL;
  170.  
  171. extern struct myst my_struct;
  172.  
  173.  
  174. extern int BatchError;        /**** BatchError Flg ****/
  175.  
  176. int SHUTBATCH = 0;
  177.  
  178. char WorkStr[255];
  179.  
  180. BOOL DupeYes = FALSE;
  181. BOOL QuickAllowed = TRUE;
  182. char SysopCommand[100];
  183.  
  184. /* end 11w */
  185. void options(void);
  186.  
  187. int CXBRK(void) { return(0); }  /* Disable Lattice CTRL/C handling */
  188.  
  189.    /******************************************************************\
  190.     *                              MAIN()                            *
  191.    \******************************************************************/
  192. char SingleName[] = "AEStat ";
  193. extern unsigned long doorextsig;
  194. struct Library *IconBase=NL;
  195.  
  196. void main(int argc,char *argv[])
  197. {
  198.   struct MsgPort *tempport;
  199.   AnsiColor=1;
  200.   tzset();
  201.   mytask=(struct Process *)FindTask(NULL);
  202.   doorextsig=AllocSignal(-1L);
  203. IO_Flags[IOFLAG_FIL_IN]=0;
  204. PagedFlag=0;
  205.  
  206.  ComputerTypes[0] = NL;
  207.  ComputerEntries = DeBuG = ShutDownFlag = ZWindow = OnlineEdit = SysopStatus= 
  208.  NOFKeys = FreeDownloads = ICON = AWAITLOGON = ICONATS = TrueReset = 0;
  209.  DStatBar=KEYIN=1;
  210.  CaptureFP=NL;
  211.  
  212.  
  213.     if(!(DOSBase=(struct Library *)OpenLibrary("dos.library",0L))) ShutDown("dos.library failed");
  214.  
  215.  if(!(IntuitionBase = (struct IntuitionBase *)OpenLibrary("intuition.library",RN)))
  216.        ShutDown("Can't open intuition.library");
  217.  
  218.  if(!(GfxBase = (struct GfxBase *)OpenLibrary("graphics.library",RN)))
  219.      ShutDown("Can't open  intuition.library");
  220.  if(!(GadToolsBase=(struct Library *)OpenLibrary("gadtools.library",0L)))
  221.      ShutDown("Can't open  GadToolsLibrary");
  222.  if(!(UtilityBase = (struct UtilityBase *)OpenLibrary("utility.library",RN)))
  223.      ShutDown("Can't open utility.library");
  224.  
  225.  if(!(RexxSysBase = (struct RexxSysBase *)OpenLibrary("rexxsyslib.library",0)))
  226.      puts("rexxsyslib.library not found, AREXX port disabled\n");
  227.   AslBase=OpenLibrary("asl.library",0L);
  228.  IconBase=OpenLibrary("icon.library",0L);
  229.   /*----------------------- Get our Config File ------------------------- */
  230.  
  231.  /**** store node number from commandline in the GSTR1 variable ****/
  232.  strcpy(GSTR1,argv[1]);
  233.  
  234.  /**** allocate memory for storing skipped uploads ****/
  235.  SkipdFiles=AllocMem(32000L,MEMF_CLEAR|MEMF_PUBLIC);
  236.  
  237.  /**** Initiate communication to ACP ****/
  238.  
  239.     CreateServerRP(atoi(argv[1]));                // create server reply port
  240.     DoorSig=ResControl(Cmds->AcLvl[LVL_NODE_NUMBER]);    // create resource control
  241.    
  242.  
  243.  /**** If MultiCom port initialized in ACP then setup appropriate links ****/
  244.  if(Sopt->Toggles[10])
  245.  {
  246.     SingleNode=(struct SinglePort *)Sopt->s;
  247.     MasterNode=(struct MultiPort *)Sopt->t;
  248.  }
  249. /** see if we already exist */
  250.  /*-- Get out port name and check if we are already running --*/
  251.  sprintf(PortName,"%s%d",PORT_NAME,Cmds->AcLvl[LVL_NODE_NUMBER]);  /* cfg port */
  252.  
  253.  if(tempport=FindPort(PortName)) {
  254.      sprintf(GSTR3,"Node %d already running!\n",Cmds->AcLvl[LVL_NODE_NUMBER]);
  255.      ShutDown(GSTR3);
  256.  }
  257.  
  258.  if(!(MyRexxPort=(struct MsgPort *) CreatePort(PortName,0L))) {
  259.      sprintf(GSTR3,"Can't create Port: %s",PortName);
  260.      ShutDown(GSTR3);
  261.  }
  262.  
  263.  RexxSig = 1L << MyRexxPort->mp_SigBit;
  264.  
  265.  Online_Baud = Online_BaudR=Cmds->OpeningBaud;   
  266.  
  267.  /**** See if we need to use STEALTH_MODE ****/
  268.  sprintf(NodeStr,"%sNode%u",Cmds->BBSLoc,Cmds->AcLvl[LVL_NODE_NUMBER]);
  269.  Stealth=IsFromIcon(NodeStr,"STEALTH_MODE"); 
  270.  if(!GetFromIconStr(NodeStr,"SYS_PWRD_PROMPT",SystemPrompt)) strcpy(SystemPrompt,">: ");
  271.  
  272.  /**** Setup upload path ****/
  273.  sprintf(NodeStr,"%sNode%u/",Cmds->BBSLoc,Cmds->AcLvl[LVL_NODE_NUMBER]);
  274.  
  275.   /** * * FIX WHEN TITLE CHANGES  suppose the file string is shorter then 20 ? */
  276.  sprintf(OpenIt.Title+20,"%03d",Cmds->AcLvl[LVL_NODE_NUMBER]);
  277.  
  278.  /**** Check to see if we are running AmiXnet ****/
  279.  sprintf(GSTR1,"%sAmiXnet/MyNode",Cmds->BBSLoc);
  280.  if(!GetFromIconStr(GSTR1,"NODE.ID",Sopt->BBSConfig)) strcpy(Sopt->BBSConfig,"");
  281.  /**** Determine Max number of conferences ****/
  282.  sprintf(GSTR1,"%sConfConfig",Cmds->BBSLoc);
  283.  Boards_Are_Active=IntFromIcon(GSTR1,"NCONFS");
  284.  
  285.  /**** Allocate and load all CONFERENCE ICONS into memory for quick reference ****/
  286.  ConfObj=GetDiskObject(GSTR1);
  287.  AllocateConfs(Boards_Are_Active);
  288.  
  289.  strcpy(NodeWork,Cmds->BBSLoc);
  290.  
  291.  if(!Sopt->StatBar) DStatBar=0;
  292.  
  293.  sprintf(UserDataLoc,"%sUser.Data",Cmds->BBSLoc);
  294.  sprintf(UserKeyLoc,"%sUser.keys",Cmds->BBSLoc);
  295.  
  296.  if(Sopt->OffHook[0]=='\0')
  297.  {
  298.     strcpy(Sopt->OffHook,"ATM0H1");
  299.  }
  300.  
  301.  
  302.  BitPlanes=Sopt->BitPlanes;
  303.  
  304. if(Sopt->TrapDoor){ TrapDoor=TRUE; sprintf(TrapConnect,"CONNECT %ld",atol(argv[2]));}
  305.  
  306.     if(BitPlanes>4||BitPlanes<0)
  307.         {
  308.         BitPlanes=3;
  309.         }
  310.         MYNewScreen.LeftEdge=(UWORD)Sopt->LeftEdge;
  311.         MYNewScreen.TopEdge=(UWORD)Sopt->TopEdge;
  312.         MYNewScreen.Width=(UWORD)Sopt->Width;
  313.         MYNewScreen.Height=(UWORD)Sopt->Height;
  314.         MYNewWindow.Height=MYNewScreen.Height-MYNewWindow.TopEdge;
  315.         MYNewWindow.Width=MYNewScreen.Width;
  316.         PaneStatus.Width=MYNewScreen.Width;
  317.           if(Sopt->Toggles[6]){
  318.               MYNewScreen.BlockPen=7;
  319.               MYNewWindow.BlockPen=7;
  320.            }
  321.         if(MYNewScreen.Height>399&&BitPlanes!=0)
  322.             {
  323.             MYNewScreen.ViewModes=MYNewScreen.ViewModes|LACE;
  324.             if(BitPlanes>4)
  325.                 {
  326.                 BitPlanes=4;
  327.                 }
  328.             }
  329.     if(BitPlanes==0)
  330.         {
  331.         PaneStatus.Height+=11;
  332.         ZmodemStats.Type=WBENCHSCREEN;
  333.     
  334.         PaneStatus.Type=WBENCHSCREEN;
  335.         CloseIt.Type=WBENCHSCREEN;
  336.         MYNewWindow.Type=WBENCHSCREEN;
  337.         MYNewWindow.LeftEdge=MYNewScreen.LeftEdge;
  338.         MYNewWindow.Width=MYNewScreen.Width;
  339.         PaneStatus.TopEdge=MYNewScreen.TopEdge;
  340.             MYNewWindow.TopEdge=MYNewScreen.TopEdge;
  341.             MYNewWindow.Height=MYNewScreen.Height;
  342.         PaneStatus.LeftEdge=MYNewScreen.LeftEdge;
  343.         CloseIt.TopEdge=MYNewScreen.TopEdge;
  344.         CloseIt.LeftEdge=MYNewScreen.LeftEdge;
  345.           ZmodemStats.LeftEdge=MYNewWindow.LeftEdge+(MYNewWindow.Width/4);
  346.           ZmodemStats.TopEdge=MYNewWindow.TopEdge+(MYNewWindow.Height/4);
  347.         }
  348.     if(BitPlanes<2)
  349.         {
  350.         PaneStatus.DetailPen=0;
  351.         PaneStatus.BlockPen=1;
  352.         }
  353.  
  354.  sprintf(WorkStr,"%sNode%u/Work/",Cmds->BBSLoc,Cmds->AcLvl[LVL_NODE_NUMBER]);
  355.  
  356.  Forbid();
  357.  SetTaskPri(FindTask(0),(LONG)Cmds->TaskPri);
  358.  Permit();
  359.  
  360.  my_struct.max_desclines = 8;
  361.  my_struct.numlastcallers = 0;
  362.  my_struct.flags = 0;
  363.  my_struct.lastcallerlevel = 255;
  364.  my_struct.callerlist = NL;
  365.  
  366.  
  367. if(Sopt->ShutDown[0]!=NULL) { SHUTBATCH=1;  }
  368.  
  369. if(Sopt->Interlace) { MYNewScreen.ViewModes=MYNewScreen.ViewModes|LACE; }
  370.  
  371. if(Sopt->QLogon) QuickAllowed=FALSE;
  372.  
  373. if(Sopt->TakeCredits) TakeCredits=TRUE;
  374.  
  375. if(Sopt->Iconify) ICONATS=1; else ICONATS=0;
  376.  
  377. if(Sopt->Toggles[0]) TrueReset=TRUE;
  378.  
  379. if(Sopt->Toggles[1]) NotRelative=FALSE;
  380.  
  381. /****** Toggles[2]=DoorLog 
  382.         Toggles[3]=StartLog
  383.         Toggles[4]=No TimeOut
  384.         Toggles[5]=No MCI Msgs
  385. *******/
  386.  
  387. sprintf(GSTR1,"%snode%d.user",Cmds->BBSLoc,Cmds->AcLvl[LVL_NODE_NUMBER]);
  388.  
  389. if(TLock(GSTR1)) DeleteFile(GSTR1);
  390.  
  391.  /**** Determine if RINGCOUNT option is selected ****/
  392. sprintf(GSTR1,"%sNode%d",Cmds->BBSLoc,Cmds->AcLvl[LVL_NODE_NUMBER]);
  393.  RingCount=IntFromIcon(GSTR1,"RINGCOUNT");
  394.  if(RingCount==0) RingCount=1;
  395.  
  396. sprintf( titlebar,"    AmiExpress BBS (c)%s  %s                      Node %ld",GetDate(),MyVerStr,Cmds->AcLvl[LVL_NODE_NUMBER]);
  397. sprintf(ptitlebar,"       AmiExpress BBS (c)%s  %s                      Node %ld",GetDate(),MyVerStr,Cmds->AcLvl[LVL_NODE_NUMBER]);
  398.  
  399. if(BitPlanes!=0)
  400.     {
  401.     MYNewScreen.DefaultTitle=(UBYTE *)&titlebar;
  402.     }
  403. else
  404.     {
  405.       PaneStatus.Title=(UBYTE *)&ptitlebar; // Used in 0 bitplanes(JOE)
  406.      MYNewWindow.Title=(UBYTE *)&titlebar;
  407.     }
  408.  
  409.  
  410.  Randomize();   /* 11w Check for Cycle Screens */
  411.                                 //(RTS)
  412.  if(!(ReadComputerTypes()))     ShutDown("Computer Types Error");
  413.                   /* Read in callers log to process for last callers util */
  414.  
  415.  SySChat=Cmds->AcLvl[LVL_DEFAULT_CHAT_ON];      /* set Sysop Chat Mode */
  416.  if(Sopt->Toggles[9]) { QuietNode=TRUE; SendQuietFlag(1); }
  417.                         else { QuietNode=FALSE; SendQuietFlag(0); }
  418.  /* get top uploader/download cps */
  419.  
  420.  Startup_Time=time(NL);
  421.  
  422.  sprintf(GSTR1,ctime(&Startup_Time));
  423.  GSTR1[strlen(GSTR1)-1]='\0';
  424.  sprintf(GSTR2,"####### BBS Node %d started on %s #######\n",Cmds->AcLvl[LVL_NODE_NUMBER],GSTR1);
  425.  StartLog(GSTR2);
  426.  Init_System(ICONATS);
  427.  relogon=0; templogon=0;
  428.  //CheckDeadLine(Startup_Time);
  429.  FOREVER {
  430.  
  431.      User.LineLength=24;
  432.  
  433.      strcpy(Conference_Location,"");
  434.     
  435.  
  436.      if(!TrapDoor){ Reset_System(1); }
  437.  
  438.      MCIViewSafe=TRUE;
  439.  
  440.  
  441.      BeenUDd=LogON=0;
  442.      ValidUser=2;
  443.      NumHistItems=0;
  444.      WhichHist=0;
  445.      HistorySelect=0;
  446.      Whence_The_Logon=AWAIT_LOGON;
  447.     if(Cmds->AcLvl[29]) ADD_BIT(ACS_DO_CALLERSLOG);
  448.        if(Sopt->Toggles[14]) ADD_BIT(ACS_WILDCARDS);
  449.      Whence_The_Logon=Await_Logon();   /* User logged on system */
  450.      if(Whence_The_Logon==REMOTE_LOGON) SetEnvStat(ENV_CONNECT);
  451. Relogon:
  452.      Time_limit=1800L;
  453.      Time_holder=0;
  454.      strcpy(flaglist,"");
  455.      strcpy(GSTR1,Cmds->BBSLoc);
  456.     strcat(GSTR1,"SystemStats");
  457.     System_Calls=IntFromFile(GSTR1,GSTR2);
  458.     System_Calls++;
  459.     IntToFile(GSTR1,System_Calls);
  460.      if(relogon) { Whence_The_Logon=templogon; relogon=0; }
  461.      BatchError = 0;
  462.  
  463.      NewSinceFlag=0;
  464.     if(TrapDoor) Whence_The_Logon=REMOTE_LOGON;
  465.      templogon=Whence_The_Logon;
  466.      switch(Whence_The_Logon) {
  467.          case SYSOP_LOGON:
  468.              Sysop_Account_Sequence();
  469.              ValidUser=1;
  470.              CheckUserOnLine(&User,0);
  471.              break;
  472.          case LOCAL_LOGON:
  473.          case REMOTE_LOGON:
  474.              if(KEYIN&&Cmds->AcLvl[LVL_SCREEN_TO_FRONT]&&MYScreen)    ScreenToFront(MYScreen);
  475.              GI1=Logon_Sequence();      /* User logged on SYstem */
  476.              if(GI1!=SUCCESS) {
  477.                 goto Skip;
  478.              }
  479.              break;
  480.          case SUSPEND_LOGON:
  481.              goto DownUnder;
  482.      }                        /* end switch */
  483.  
  484. sprintf(GSTR1,"%sScreenTypes",Cmds->BBSLoc);
  485.          sprintf(GSTR2,"TITLE.%d",User.ScreenType+1);
  486.          GetFromIconStr(GSTR1,GSTR2,langtitle);
  487.          sprintf(GSTR2,"TYPE.%d",User.ScreenType+1);
  488.          GetFromIconStr(GSTR1,GSTR2,lang);
  489. /*---11w Cycle screens --- */
  490.  if(QuickFlag) goto byp;
  491. if(User.Sec_Status > Cmds->PSAcLvl[0] && Whence_The_Logon!=SYSOP_LOGON) {
  492.              sprintf(GSTR1,"%sLogon",Sopt->NodeScreen);
  493.      
  494.      if(ChecktoDisplay(GSTR1,GSTR3,1,0)) DoPause();
  495.   }
  496. /*--- end 11w cycle screens --- */
  497.  
  498. //--------------------------------------------------------
  499. byp: ;
  500.  
  501.      GI1=Menu();
  502.                       /*  RTS  OUR MAIN ONLINE USER LOOP */
  503.      SetEnvStat(ENV_NOTACTIVE);
  504.      if(CaptureFP) {
  505.          fclose(CaptureFP);
  506.          CaptureFP=NL;
  507.      }
  508.      Check_Online_Status();
  509.      ChatFlag=0;
  510.      flaglist[0]='\0';
  511.  
  512.  Skip:
  513.      ClearUser();
  514.  
  515.  
  516.      if(ValidUser!=2) {
  517.  
  518.          if(ValidUser==3)    (void)LogOffLog("UUCP feed completed");
  519.          else  {
  520.              if(GI1==STANDARD_LOGOFF)    LogOffLog("N");
  521.               else   LogOffLog("Loss Carrier");
  522.          }
  523.      }
  524.      if(User.Sec_Status!=0 && User.Slot_Number!=0 && ValidUser==1) {
  525.  
  526.          PagedFlag=0;
  527.          if(SysopStatus) {
  528.              User.Sec_Status=TSI.AccessLevel;
  529.              User.Sec_Board=TSI.RatioType;
  530.              User.Sec_Library=TSI.Ratio;
  531.              User.Time_Total=TSI.TimeTotal;
  532.              memcpy(User.Conference_Access,TSI.ConfAc,10);
  533.              SysopStatus=0;
  534.          }
  535.          StatPrintUser(&User);
  536.         
  537.          strcpy(User_keys.UserName,User.Name);
  538.          strupr(User_keys.UserName);
  539.          User_keys.Number=User.Slot_Number;
  540.  
  541.          if(NewSinceFlag) {
  542.              User.NewSinceDate=time(NL);
  543.              
  544.          }
  545.           SaveMsgPointers(CN);
  546.           NewSinceFlag=0;
  547.           User.Time_Last_On=time(NULL);
  548.          AddMsgPointers();
  549.          MasterSavePointers();
  550.          Save_Account(&User,&User_keys,0,0);    /* Reseave users account after logoff */
  551.  
  552.  
  553.          ReservedName[0]='\0';
  554.          if(relogon) 
  555.          {
  556.            sprintf(GSTR1,"%sCommands/SysCmd/",Cmds->BBSLoc);
  557.          strcpy(GSTR2,"RELOGON");
  558.          CustomCommand(GSTR1,GSTR2,1);
  559.           sprintf(GSTR1,"%sCommands/SysCmd/",Cmds->BBSLoc);
  560.          sprintf(GSTR2,"RELOGON%d",Cmds->AcLvl[LVL_NODE_NUMBER]);
  561.          CustomCommand(GSTR1,GSTR2,1);
  562.         goto Relogon;
  563.          }
  564.          if(KEYIN&&Cmds->AcLvl[LVL_SCREEN_TO_FRONT]&&MYScreen)
  565.          {   ScreenToBack(MYScreen);}
  566.              ModemOffHook();
  567.                 
  568.          sprintf(GSTR1,"%sCommands/SysCmd/",Cmds->BBSLoc);
  569.          strcpy(GSTR2,"LOGOFF");
  570.          CustomCommand(GSTR1,GSTR2,1);
  571.          sprintf(GSTR1,"%sCommands/SysCmd/",Cmds->BBSLoc);
  572.          sprintf(GSTR2,"LOGOFF%d",Cmds->AcLvl[LVL_NODE_NUMBER]);
  573.          CustomCommand(GSTR1,GSTR2,1);
  574.          
  575.      }
  576. DownUnder:
  577.      CheckShutDown();
  578.     if(TrapDoor) ShutDown("!");
  579.  }
  580. }
  581.  
  582. void CheckShutDown(void)
  583. {
  584.  if(ShutDownFlag==1) {
  585.             ReplyMsg((struct Message *) SDReplyRexx);
  586.      ShutDown("!");
  587.  }
  588.  if(ShutDownFlag==2) {
  589.          ReplyMsg((struct Message *) SReplyRexx);
  590.          SuspendBBS();
  591.          Display_Logo();
  592.          ReInitModem();
  593.   }
  594.   ShutDownFlag=0;
  595. }
  596.  
  597.  
  598. void SuspendBBS(void)
  599. {
  600.  BYTE LICON;
  601.  
  602.  Whence_The_Logon=SUSPEND_LOGON;
  603.  LICON=ICON;
  604.  
  605.  if(!ICON) {
  606.     IconifyAE();
  607.  }
  608.  
  609. /* ... Skipped ALL thist !!!! DID NOT WAUT */
  610.  if(SEROUT && ReadSerReq) {
  611.      AbortIO(ReadSerReq);
  612.      WaitIO(ReadSerReq);
  613.  }
  614.  CloseSerial();
  615.  
  616.  Time_system=time(NL);
  617.  
  618.  sprintf(GSTR3,"BBS has been suspended at %s",ctime(&Time_system));
  619.  StartLog(GSTR3);
  620.  
  621.  while(Whence_The_Logon==SUSPEND_LOGON) {
  622.      Wait(RexxSig);
  623.      CheckRexxMessage();
  624.  }
  625.  Time_system=time(NL);
  626.  
  627.  sprintf(GSTR3,"BBS has received resume @ %s",ctime(&Time_system));
  628.  StartLog(GSTR3);
  629.  
  630.  if(OpenSerial(Cmds->OpeningBaud,(UBYTE)8,(UBYTE)1)!=0) {
  631.      sprintf(GSTR3,"Can't re-open %s!",Cmds->SerDev);
  632.      ShutDown(GSTR3);
  633.  }
  634.  
  635.  
  636.  if(!LICON)  {  /* got msg to LICON this (Uniconify this */
  637.     UnIconifyAE(0);
  638.  }
  639.  
  640.  
  641. }
  642.  
  643. static void closelibs(void)
  644. {
  645.  DeAllocateConfs();
  646.  
  647.     if(IconBase)     CloseLibrary(IconBase);
  648.     if(AslBase)     CloseLibrary(AslBase);
  649.     if(UtilityBase)     CloseLibrary((struct Library *) UtilityBase);
  650.     if(RexxSysBase)     CloseLibrary((struct Library *) RexxSysBase);
  651.     if(GadToolsBase) CloseLibrary((struct Library *) GadToolsBase);
  652.     if(GfxBase)       CloseLibrary((struct Library *) GfxBase);
  653.     if(IntuitionBase) CloseLibrary((struct Library *) IntuitionBase);
  654.     if(DOSBase) CloseLibrary((struct Library *) DOSBase);
  655. }
  656.  
  657. void ShutDown(char *s)
  658. {
  659.  BPTR tempfh;
  660.  struct RexxMsg *rexxmsg=NL;
  661.  Startup_Time=time(NL);
  662.  sprintf(GSTR1,ctime(&Startup_Time));
  663.  GSTR1[strlen(GSTR1)-1]='\0';
  664.  SetEnvStat(ENV_SHUTDOWN); Delay(10L);
  665.  
  666.  sprintf(GSTR2,"####### BBS Node %d shutdown @ %s#######\n",Cmds->AcLvl[LVL_NODE_NUMBER],GSTR1);
  667.  StartLog(GSTR2);
  668.  if(SHUTBATCH) {
  669.     sprintf(GSTR1,"execute %s %d",Sopt->ShutDown,Cmds->AcLvl[LVL_NODE_NUMBER]);
  670.     if(tempfh=Open("NIL:",MODE_OLDFILE))     {
  671.          Execute(GSTR1,tempfh,tempfh);
  672.          Close(tempfh);
  673.     }
  674. }
  675.  if(ComputerTypes[0]!=NL)     FreeMem(ComputerTypes[0],ComputerEntries*90);
  676.  if(HistoryBuf)               FreeMem(HistoryBuf,MAXHIST*250);
  677.  
  678.  if(MyRexxPort) {
  679.      while(rexxmsg = (struct RexxMsg *) GetMsg((struct MsgPort *) MyRexxPort))
  680.        ReplyMsg((struct Message *) rexxmsg);
  681.      DeletePort((struct MsgPort *) MyRexxPort);
  682.  }
  683.  FreeDiskObject(ConfObj);
  684.  
  685.  DeleteServerRP();
  686.  DeleteResControl();
  687.  
  688.  if(!ICON)  CloseConsole();
  689.  if(SEROUT) CloseSerial();
  690.   CloseTimer();
  691.  FreeSignal(doorextsig);
  692.  if(Iconify){ CloseWindow(Iconify);}
  693.  if(StatusPane && DStatBar) { CloseWindow(StatusPane); }
  694.  if(MYwindow) { CloseWindow(MYwindow);}
  695.  if(BitPlanes!=0)
  696.  {
  697.  if(closeimage) DisposeObject(closeimage);
  698.  if(drinfo) FreeScreenDrawInfo(MYScreen, drinfo);
  699.  if(MYScreen) CloseScreen(MYScreen); 
  700.  }
  701.  FreeMem(SkipdFiles,32000L);
  702.  closelibs();              /* closes All Libraries open */
  703.  
  704.  exit(0);
  705. }
  706.  
  707. void ModemOffHook(void)
  708. {
  709.    if(Cmds->SerDev[0]!='\0')
  710.                  {
  711.                    
  712.                   if(Sopt->Toggles[17])
  713.                  {
  714.                    Reset_System(0);
  715.                 IntDoReset(Sopt->OffHook);
  716.                 IO_Flags[IOFLAG_SER_IN]=0;
  717.                 IO_Flags[IOFLAG_SER_OUT]=0;
  718.                 IO_Flags[IOFLAG_SCR_OUT]=1;
  719.                 IO_Flags[IOFLAG_KBD_IN]=1;
  720.                  }else
  721.                  {
  722.                    DropDTR();Delay(25L);//Reset_System(0);
  723.                    IntDoReset(Sopt->OffHook);
  724.                    Delay(5L);
  725.                    Dropped_Hook=1;
  726.                  IO_Flags[IOFLAG_SER_IN]=0;
  727.                  IO_Flags[IOFLAG_SER_OUT]=0;
  728.                  IO_Flags[IOFLAG_SCR_OUT]=1;
  729.                  IO_Flags[IOFLAG_KBD_IN]=1;
  730.                  }
  731.                  }
  732. }
  733.  
  734. struct MyConfBase
  735. {
  736.   struct MinNode l;
  737.   struct ConfBase CB;
  738. };
  739.  
  740. void AllocateConfs(int NumConfs)
  741. {
  742.    register int i;
  743.    char image[100];
  744.    char image1[100];
  745.    struct DiskObject *dobj;
  746.    struct MyConfBase *confbase;
  747.    ConfDBList=AllocMem(sizeof(struct List),MEMF_CLEAR);
  748.    NewList(ConfDBList);
  749.    MemConf=(ULONG *)AllocMem(((ULONG)NumConfs+1L)*(ULONG)sizeof(ULONG),MEMF_CLEAR|MEMF_PUBLIC);
  750.    for(i=0;i<NumConfs;i++)
  751.    {
  752.      confbase=AllocMem(sizeof(struct MyConfBase),MEMF_CLEAR);
  753.      AddHead((struct List *)ConfDBList,(struct Node *)confbase);
  754.      GetConfName(image1,image,i);
  755.        image[strlen(image)-1]='\0';
  756.        dobj=GetDiskObject(image);
  757.        //*(MemConf+(ULONG)i)=(ULONG)dobj;
  758.        MemConf[i]=(ULONG)dobj;
  759.    }
  760.    //*(MemConf+(ULONG)i)=NULL;
  761.    MemConf[i]=NULL;
  762. }
  763.  
  764. void DeAllocateConfs(void)
  765. {
  766.    register int i=0;
  767.    struct DiskObject *dobj;
  768.    struct MyConfBase *it;
  769.    struct MyConfBase *tt;
  770.    if(MemConf)
  771.    {
  772.    while(*(MemConf+(ULONG)i)!=NULL)
  773.    {
  774.      //dobj=(struct DiskObject *)*(MemConf+(ULONG)i);
  775.      dobj=(struct DiskObject *)MemConf[i];
  776.      FreeDiskObject(dobj);
  777.      i +=1;
  778.    }
  779.    i +=1;
  780.    FreeMem(MemConf,(ULONG)i*(ULONG)sizeof(ULONG));
  781.    it=(struct MyConfBase *)(ConfDBList->lh_Head);
  782.    while(tt=(struct MyConfBase *)(it->l.mln_Succ))
  783.    {
  784.       FreeMem(it,sizeof(struct MyConfBase));
  785.       it=tt;
  786.    }
  787.    FreeMem(ConfDBList,sizeof(struct List));
  788.   }
  789. }
  790.  
  791. #define NumVersion 301L
  792.  
  793. void CheckDeadLine(ULONG num)
  794. {
  795.   if(num>deadtime)
  796.     ShutDown("!");
  797. }
  798.  
  799.